using EOSDigital.SDK;

namespace EOSDigital.API
{
	public class CameraValue
	{
		public string StringValue
		{
			get;
			protected set;
		}

		public int IntValue
		{
			get;
			protected set;
		}

		public double DoubleValue
		{
			get;
			protected set;
		}

		public PropertyID ValueType
		{
			get;
			protected set;
		}

		protected CameraValue()
		{
			this.ValueType = PropertyID.Unknown;
			this.StringValue = "N/A";
			this.IntValue = -1;
			this.DoubleValue = 0.0;
		}

		public CameraValue(string Value, PropertyID ValueType)
			: this()
		{
			this.ValueType = ValueType;
			this.StringValue = Value;
			switch (ValueType)
			{
			case PropertyID.Av:
				this.IntValue = AvValues.GetValue(Value).IntValue;
				this.DoubleValue = AvValues.GetValue(Value).DoubleValue;
				break;
			case PropertyID.Tv:
				this.IntValue = TvValues.GetValue(Value).IntValue;
				this.DoubleValue = TvValues.GetValue(Value).DoubleValue;
				break;
			case PropertyID.ISO:
				this.IntValue = ISOValues.GetValue(Value).IntValue;
				this.DoubleValue = ISOValues.GetValue(Value).DoubleValue;
				break;
			case PropertyID.ColorTemperature:
			{
				int num = default(int);
				this.IntValue = (int.TryParse(Value, out num) ? num : 5600);
				this.DoubleValue = (double)num;
				break;
			}
			case PropertyID.AEMode:
				this.IntValue = AEModeValues.GetValue(Value).IntValue;
				this.DoubleValue = AEModeValues.GetValue(Value).DoubleValue;
				break;
			case PropertyID.MeteringMode:
				this.IntValue = MeteringModeValues.GetValue(Value).IntValue;
				this.DoubleValue = MeteringModeValues.GetValue(Value).DoubleValue;
				break;
			case PropertyID.ExposureCompensation:
				this.IntValue = ExpCompValues.GetValue(Value).IntValue;
				this.DoubleValue = ExpCompValues.GetValue(Value).DoubleValue;
				break;
			case PropertyID.ImageQuality:
				this.IntValue = ImageQualityValues.GetValue(Value).IntValue;
				this.DoubleValue = ImageQualityValues.GetValue(Value).DoubleValue;
				break;
			case PropertyID.PictureStyle:
				this.IntValue = PictureStyleValues.GetValue(Value).IntValue;
				this.DoubleValue = PictureStyleValues.GetValue(Value).DoubleValue;
				break;
			case PropertyID.Evf_AFMode:
				this.IntValue = EvfAfModeValues.GetValue(Value).IntValue;
				this.DoubleValue = EvfAfModeValues.GetValue(Value).DoubleValue;
				break;
			}
		}

		public CameraValue(int Value, PropertyID ValueType)
			: this()
		{
			this.ValueType = ValueType;
			this.IntValue = Value;
			switch (ValueType)
			{
			case PropertyID.Av:
				this.StringValue = AvValues.GetValue(Value).StringValue;
				this.DoubleValue = AvValues.GetValue(Value).DoubleValue;
				break;
			case PropertyID.Tv:
				this.StringValue = TvValues.GetValue(Value).StringValue;
				this.DoubleValue = TvValues.GetValue(Value).DoubleValue;
				break;
			case PropertyID.ISO:
				this.StringValue = ISOValues.GetValue(Value).StringValue;
				this.DoubleValue = ISOValues.GetValue(Value).DoubleValue;
				break;
			case PropertyID.ColorTemperature:
				this.StringValue = Value.ToString();
				this.DoubleValue = (double)Value;
				break;
			case PropertyID.AEMode:
				this.StringValue = AEModeValues.GetValue(Value).StringValue;
				this.DoubleValue = AEModeValues.GetValue(Value).DoubleValue;
				break;
			case PropertyID.MeteringMode:
				this.StringValue = MeteringModeValues.GetValue(Value).StringValue;
				this.DoubleValue = MeteringModeValues.GetValue(Value).DoubleValue;
				break;
			case PropertyID.ExposureCompensation:
				this.StringValue = ExpCompValues.GetValue(Value).StringValue;
				this.DoubleValue = ExpCompValues.GetValue(Value).DoubleValue;
				break;
			case PropertyID.WhiteBalance:
				this.StringValue = WhiteBalanceValues.GetValue(Value).StringValue;
				this.DoubleValue = WhiteBalanceValues.GetValue(Value).DoubleValue;
				break;
			case PropertyID.ImageQuality:
				this.StringValue = ImageQualityValues.GetValue(Value).StringValue;
				this.DoubleValue = ImageQualityValues.GetValue(Value).DoubleValue;
				break;
			case PropertyID.PictureStyle:
				this.StringValue = PictureStyleValues.GetValue(Value).StringValue;
				this.DoubleValue = PictureStyleValues.GetValue(Value).DoubleValue;
				break;
			case PropertyID.Evf_AFMode:
				this.StringValue = EvfAfModeValues.GetValue(Value).StringValue;
				this.DoubleValue = EvfAfModeValues.GetValue(Value).DoubleValue;
				break;
			}
		}

		public CameraValue(double Value, PropertyID ValueType)
			: this()
		{
			this.ValueType = ValueType;
			this.DoubleValue = Value;
			switch (ValueType)
			{
			case PropertyID.Av:
				this.StringValue = AvValues.GetValue(Value).StringValue;
				this.IntValue = AvValues.GetValue(Value).IntValue;
				break;
			case PropertyID.Tv:
				this.StringValue = TvValues.GetValue(Value).StringValue;
				this.IntValue = TvValues.GetValue(Value).IntValue;
				break;
			case PropertyID.ISO:
				this.StringValue = ISOValues.GetValue(Value).StringValue;
				this.IntValue = ISOValues.GetValue(Value).IntValue;
				break;
			case PropertyID.ColorTemperature:
				this.StringValue = Value.ToString("F0");
				this.IntValue = (int)Value;
				break;
			case PropertyID.AEMode:
				this.StringValue = AEModeValues.GetValue(Value).StringValue;
				this.IntValue = AEModeValues.GetValue(Value).IntValue;
				break;
			case PropertyID.MeteringMode:
				this.StringValue = MeteringModeValues.GetValue(Value).StringValue;
				this.IntValue = MeteringModeValues.GetValue(Value).IntValue;
				break;
			case PropertyID.ExposureCompensation:
				this.StringValue = ExpCompValues.GetValue(Value).StringValue;
				this.IntValue = ExpCompValues.GetValue(Value).IntValue;
				break;
			case PropertyID.Evf_AFMode:
				this.StringValue = EvfAfModeValues.GetValue(Value).StringValue;
				this.IntValue = EvfAfModeValues.GetValue(Value).IntValue;
				break;
			}
		}

		internal CameraValue(string SValue, int IValue, double DValue)
		{
			this.ValueType = PropertyID.Unknown;
			this.StringValue = SValue;
			this.IntValue = IValue;
			this.DoubleValue = DValue;
		}

		internal CameraValue(string SValue, int IValue, double DValue, PropertyID ValueType)
		{
			this.ValueType = ValueType;
			this.StringValue = SValue;
			this.IntValue = IValue;
			this.DoubleValue = DValue;
		}

		public static bool operator ==(CameraValue x, CameraValue y)
		{
			if (object.ReferenceEquals(x, y))
			{
				return true;
			}
			if ((object)x != null && (object)y != null)
			{
				if (x.IntValue == y.IntValue)
				{
					return x.ValueType == y.ValueType;
				}
				return false;
			}
			return false;
		}

		public static bool operator !=(CameraValue x, CameraValue y)
		{
			return !(x == y);
		}

		public override bool Equals(object obj)
		{
			if (obj.GetType() != base.GetType())
			{
				return false;
			}
			if (object.ReferenceEquals(this, obj))
			{
				return true;
			}
			CameraValue cameraValue = obj as CameraValue;
			if (cameraValue == (CameraValue)null)
			{
				return false;
			}
			if (this.IntValue == cameraValue.IntValue)
			{
				return this.ValueType == cameraValue.ValueType;
			}
			return false;
		}

		public override int GetHashCode()
		{
			int num = -2128831035;
			num *= (0x1000193 ^ this.IntValue.GetHashCode());
			return num * (0x1000193 ^ this.ValueType.GetHashCode());
		}

		public static implicit operator int(CameraValue x)
		{
			return x.IntValue;
		}

		public static implicit operator string(CameraValue x)
		{
			return x.StringValue;
		}

		public static implicit operator double(CameraValue x)
		{
			return x.DoubleValue;
		}

		public override string ToString()
		{
			return this.StringValue;
		}
	}
}
